﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CCL.Utility;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace CCL.SocketMessage.Request
{
    /// <summary>
    /// 로그인을 요청하는 Message의 Body를 제공합니다.
    /// </summary>
    public class Login : Body
    {
        /// <summary>
        /// 로그인 할 회원의 E-Mail주소를 가져옵니다.
        /// </summary>
        public char[] Email { get; private set; }

        /// <summary>
        /// 로그인 할 회원의 비밀번호를 가져옵니다.
        /// </summary>
        public char[] Password { get; private set; }

        /// <summary>
        /// 새로운 Login 객체를 생성합니다.
        /// </summary>
        /// <param name="email">로그인 할 회원의 E-Mail</param>
        /// <param name="password">로그인 할 회원의 Password</param>
        public Login(string email, string password)
        {
            Email = StringUtility.StringCopy(email, Constant.Length.Email);
            Password = StringUtility.StringCopy(password, Constant.Length.Password);
        }

        /// <summary>
        /// 직렬화된 byte 배열을 통해 Login 객체를 생성합니다.
        /// </summary>
        /// <param name="bytes">직렬화된 byte 배열</param>
        public Login(byte[] bytes)
        {
            int start = 0;

            Email = new char[Constant.Length.Email];
            Encoding.Default.GetChars(bytes, start, Constant.Length.Email, Email, 0);
            start += Constant.Length.Email;

            Password = new char[Constant.Length.Password];
            Encoding.Default.GetChars(bytes, start, Constant.Length.Password, Password, 0);
        }

        /// <summary>
        /// 바이트 배열로 직렬화 합니다.
        /// </summary>
        /// <returns>직렬화된 바이트 배열</returns>
        public override byte[] GetByte()
        {
            byte[] bytes = new byte[GetSize()];

            int destIndex = 0;
            byte[] temp;

            temp = Encoding.Default.GetBytes(Email);
            Array.Copy(temp, 0, bytes, destIndex, temp.Length);
            destIndex += temp.Length;

            temp = Encoding.Default.GetBytes(Password);
            Array.Copy(temp, 0, bytes, destIndex, temp.Length);

            return bytes;
        }

        /// <summary>
        /// 직렬화 가능한 객체의 바이트 사이즈를 가져옵니다.
        /// </summary>
        /// <returns>직렬화된 바이트 사이즈</returns>
        public override uint GetSize()
        {
            return Constant.Length.Email + Constant.Length.Password;
        }
    }
}
